package gradle.rabbit.common.utils;

import gradle.common.core.context.SpringApplicationContext;
import gradle.common.core.utils.JsonUtil;
import gradle.rabbit.common.constants.RabbitTemplateConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.util.CollectionUtils;

import java.util.Map;
import java.util.Objects;

/**
 * RabbitTemplateUtil
 */
@Slf4j
public class PrimaryRabbitTemplateUtil {

//    /**
//     * 消费异常队列存储路径
//     */
//    @Value("${spring.rabbitmq.error-message.save-path}")
//    String errorMessageFolder;

    /**
     * 【清关系统】消息发送
     *
     * @param exchange   交换机
     * @param routingKey 路由
     * @param message    消息
     */
    public static void convertAndSend(String exchange, String routingKey, Object message) {
        RabbitTemplate rabbitTemplate = (RabbitTemplate) SpringApplicationContext.getBean(RabbitTemplateConstant.PRIMARY_RABBIT_TEMPLATE);
        if (StringUtils.isBlank(exchange) || Objects.isNull(message)) {
            return;
        }
        boolean instance = message instanceof String || message instanceof Message;
        rabbitTemplate.convertAndSend(exchange, routingKey, instance ? message : JsonUtil.toJsonString(message));
    }

    /**
     * 【清关系统】消息发送
     *
     * @param exchange 交换机
     * @param message  消息
     * @param headers  headers
     */
    public static void convertAndSendHaveHeader(String exchange, Object message, Map<String, String> headers) {
        convertAndSendHaveHeader(exchange, StringUtils.EMPTY, message, headers);
    }

    /**
     * 【清关系统】消息发送
     *
     * @param exchange 交换机
     * @param message  消息
     * @param headers  headers
     */
    public static void convertAndSendHaveHeader(String exchange, String routingKey, Object message, Map<String, String> headers) {
        RabbitTemplate rabbitTemplate = (RabbitTemplate) SpringApplicationContext.getBean(RabbitTemplateConstant.PRIMARY_RABBIT_TEMPLATE);

        if (StringUtils.isBlank(exchange) || Objects.isNull(message)) {
            log.error("【RabbitTemplateUtil】Invalid params，exchange = {}, message = {}", exchange, message);
            return;
        }
        if (CollectionUtils.isEmpty(headers)) {
            convertAndSend(exchange, routingKey, message);
        } else {
            rabbitTemplate.convertAndSend(exchange, routingKey, message, msg -> {
                for (Map.Entry<String, String> entry : headers.entrySet()) {
                    msg.getMessageProperties().setHeader(entry.getKey(), entry.getValue());
                }
                return msg;
            });
        }
    }


    /**
     * 【清关系统】消息发送
     *
     * @param exchange 交换机
     * @param message  消息
     */
    public static void convertAndSend(String exchange, Object message) {
        convertAndSend(exchange, "", message);
    }


    /**
     * 延时消息发送
     *
     * @param exchange       交换机
     * @param routingKey     路由键
     * @param message        消息
     * @param expirationTime 延时时间 单位毫秒
     */
    public static void convertAndSendDelay(String exchange, String routingKey, Object message, long expirationTime) {
        RabbitTemplate rabbitTemplate = (RabbitTemplate) SpringApplicationContext.getBean(RabbitTemplateConstant.PRIMARY_RABBIT_TEMPLATE);

        if (StringUtils.isBlank(exchange) || Objects.isNull(message)) {
            log.error("【RabbitTemplateUtil】Invalid params，exchange = {}, message = {}", exchange, message);
            return;
        }
        rabbitTemplate.convertAndSend(exchange, routingKey, message, msg -> {
            msg.getMessageProperties().setExpiration(String.valueOf(expirationTime));
            return msg;
        });
    }


//    /**
//     * 存储MQ消费错误数据到文件
//     * 以队列名称为文件夹名，以消息内容为文件内容，存储到指定目录下
//     * 文件名以时间戳 + uuid + .txt命名
//     *
//     * @param queueName 队列名称
//     * @param content   消息内容
//     */
//    public void saveErrorMessage(String queueName, String content, String errorMessage) {
//        if (StringUtils.isBlank(queueName) || StringUtils.isBlank(content)) {
//            log.error("【RabbitTemplateUtil】Save error message failed. Invalid params，queueName or content is null!");
//            return;
//        }
//        String fileName = System.currentTimeMillis() + "_" + UUID.randomUUID() + ".txt";
//        try {
//            String filePath = errorMessageFolder + "/" + queueName + "/" + fileName;
//            Path path = Path.of(filePath);
//            // 创建文件夹
//            Files.createDirectories(path.getParent());
//            Files.createFile(path);
//            // 写入文件
//            Files.writeString(path, content, Charset.forName("UTF-8"), StandardOpenOption.APPEND);
//            // mq告警信息
//            AlarmRequest alarmRequest = AlarmRequest.builder()
//                    .queueName(queueName)
//                    .message(content)
//                    .filePath(filePath)
//                    .hostName(getHostName())
//                    .errorMessage(errorMessage)
//                    .build();
//            rabbitTemplate.convertAndSend(DataCenterOutExchangeConstants.DATA_CENTER_OUT_ALARM_MESSAGE,
//                    StringUtils.EMPTY, JsonUtil.toJsonString(alarmRequest));
//        } catch (Exception e) {
//            log.error("【RabbitTemplateUtil】Save error message failed. queueName = {}, content = {}", queueName, content, e);
//        }
//    }
//
//
//    /**
//     * 获取本机ip地址方法
//     *
//     * @return 本机ip
//     */
//    private String getHostName() {
//        try {
//            return InetAddress.getLocalHost().getHostName();
//        } catch (Exception e) {
//            return StringUtils.EMPTY;
//        }
//    }

}
